﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using ConfigurationManager.View;
using System.Text;
using ConfigurationManager.Model;
using PSE.Framework.ErrorLogging;
using PSE.Framework.Configuration;
using PSE.Framework.Process;

namespace ConfigurationManager
{
    class Program : BaseProgram
    {
        static Program()
        {
            Initialize(PSE.Framework.Configuration.Components.SystemComponents.System, PSE.Framework.Configuration.Components.SystemComponents.ProcessManagerConfigurationManager);
        }

        [DllImport("kernel32.dll")]
        static extern bool AttachConsole(int dwProcessId);
        private const int ATTACH_PARENT_PROCESS = -1;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frmMain());
            }
            else
            {
                // redirect console output to parent process;
                // must be before any calls to Console.WriteLine()
                AttachConsole(ATTACH_PARENT_PROCESS);

                if (args[0] == "/export")
                {
                    if (args.Length != 5)
                        Console.WriteLine(CreateHelpText());
                    else
                    {
                        ProductExportInfo exportInfo = new ProductExportInfo();

                        exportInfo.ProductName = args[1];
                        exportInfo.ProcessesFolderPath = args[2];
                        exportInfo.STSAuthorityCertificateName = args[3];
                        exportInfo.ServiceCertificateName = args[4];

                        Model.Exporter.Export(exportInfo);

                        Console.WriteLine("Configurações exportadas com sucesso.");
                    }
                }
                else if (args[0] == "/help")
                    Console.WriteLine(CreateHelpText());
            }
        }

        private static string CreateHelpText()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Parâmetros de uso:");
            sb.AppendLine("=> /help -> exibe estas informações.");
            sb.AppendLine("=> /export -> executa em modo de exportação, abaixo seguem os parâmetros obrigatórios (em ordem de entrada):");
            sb.AppendLine("-[ProductName] -> nome do produto cuja os dados serão exportados.");
            sb.AppendLine("-[ProcessesFolder] -> caminho do diretório onde se encontram os binários dos processos do produto.");
            sb.AppendLine("-[StsAuthorityCertificate] -> nome do certificado STS Atuhority do produto.");
            sb.AppendLine("-[ServiceCertificate] -> nome do certificado Service do produto.");

            return sb.ToString();
        }

        public static new void HandleException(Exception ex)
        {
            BaseProgram.HandleException(ex);

            MessageBox.Show("Ocorreu um erro interno, verifique o log para maiores detalhes.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
